//package com.example.makerspace.controller.socket;
//
//import cn.hutool.core.bean.BeanUtil;
//import cn.hutool.json.JSONUtil;
//import com.example.makerspace.dao.ImsingleDAO;
//import com.example.makerspace.dao.OnlineUserListDAO;
//import com.example.makerspace.dao.UserDAO;
//import com.example.makerspace.domain.ChatMessage;
//import com.example.makerspace.domain.ImsingleDO;
//import com.example.makerspace.domain.OnlineUserListDO;
//import com.example.makerspace.domain.UserDO;
//import com.example.makerspace.dto.robotDTO.ImsingleDTO;
//import com.example.makerspace.mapper.ImsingleMapper;
//import com.example.makerspace.service.ApplicationService;
//import com.fasterxml.jackson.core.JsonProcessingException;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import io.swagger.models.auth.In;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.BeanUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
//
//import javax.websocket.*;
//import javax.websocket.server.PathParam;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.Set;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.CopyOnWriteArraySet;
//
///**
// * @author: zpt
// * @Date: 2019-09-20 15:12
// * @Description:
// */
//@Component
//@ServerEndpoint("/chat/webSocket/{page}/{userId}")
//public class WebSocket {
//
//    private static UserDAO userDAO;
//
//    @Autowired
//    public void setMyServiceImpl(UserDAO userDAO){
//        WebSocket.userDAO = userDAO;
//    }
//
//
//    private static OnlineUserListDAO onlineUserListDAO;
//    private static ImsingleDAO imsingleDAO;
//
//    @Autowired
//    public void setImsingleDAO(ImsingleDAO imsingleDAO){
//        WebSocket.imsingleDAO = imsingleDAO;
//    }
//    @Autowired
//    public void setOnlineUserListDAO(OnlineUserListDAO onlineUserListDAO){
//        WebSocket.onlineUserListDAO = onlineUserListDAO;
//    }
//
//
//    private Logger log = LoggerFactory.getLogger(this.getClass());
//
//    /**
//     * 记录是否为用户或者客服
//     */
//    private static Map<Integer, Set> roomMap = new ConcurrentHashMap(8);
//
//    /**
//     * 用来记录session_id与用户id之间的关系
//     */
//    private static Map<String, Integer> userIdMap = new ConcurrentHashMap(8);
//
//    //用本地线程保存session
//    private static ThreadLocal<Session> sessions = new ThreadLocal<Session>();
//    //保存所有连接上的用户的session
//    private static Map<String, UserDO> userSessionMap = new ConcurrentHashMap<>();
//    //保存在线客服的session
//    private static Map<String, UserDO> serverSessionMap = new ConcurrentHashMap<>();
//
//
//
//    @OnOpen
//    public void open(@PathParam("role") Integer role, Session session, @PathParam("userId") Integer userId ) throws IOException {
//        Set set = roomMap.get(role);
//        userIdMap.put(session.getId(), userId);
//        UserDO userDO = userDAO.selectById(userId);
//        OnlineUserListDO onlineUserListDO = new OnlineUserListDO();
//
//        BeanUtils.copyProperties(userDO,onlineUserListDO);
//        //在线用户统计
//        onlineUserListDAO.insert(onlineUserListDO);
//        // 如果是新的房间，则创建一个映射，如果房间已存在，则把用户放进去
//        if (set == null) {
//            set = new CopyOnWriteArraySet();
//            set.add(session);
//            roomMap.put(role, set);
//        } else {
//            set.add(session);
//        }
//    }
//
//    @OnClose
//    public void close( @PathParam("role") Integer role, Session session, @PathParam("userId") Integer userId ) {
//        userIdMap.remove(session.getId());
//        //删除在线用户列表
//        onlineUserListDAO.deleteById(userId);
//        // 如果某个用户离开了，就移除相应的信息
//        if (roomMap.containsKey(role)) {
//            roomMap.get(role).remove(session);
//        }
//    }
//
//    @OnMessage
//    public void reveiveMessage( @PathParam("role") Integer role, Session session, String message ) throws IOException {
//        //从客户端传过来的数据是json数据，所以这里使用jackson进行转换为chatMsg对象，
//        ObjectMapper objectMapper = new ObjectMapper();
//        ChatMessage chatMsg;
//
//        try {
//            try {
//                chatMsg = objectMapper.readValue(message, ChatMessage.class);
//            } catch (JsonProcessingException e) {
//                throw new RuntimeException(e);
//            }
//
//
//            log.info("接受到用户{}的数据:{}", session.getId(), message);
//
//            Integer userId = userIdMap.get(session.getId());
//
//            UserDO userDO = userDAO.selectById(userId);
//
//            //存入数据库中
//            ImsingleDO imsingleDO = new ImsingleDO();
//            imsingleDO.setFromuser(chatMsg.getFromUser());
//            imsingleDO.setTouser(chatMsg.getToUser());
//            imsingleDO.setContent(chatMsg.getContent());
//            imsingleDO.setReaded(0);
//            imsingleDAO.insert(imsingleDO);
//
//
//            //返回给前端的Bo对象
//            ImsingleDTO contentBo = new ImsingleDTO();
//            BeanUtil.copyProperties(imsingleDO, contentBo);
//
//
//            // 拼接一下用户信息
//            //String msg = session.getId() + " : " + message;
//            Set<Session> sessions = roomMap.get(role);
//            // 给房间内所有用户推送信息
//            for (Session s : sessions) {
//                if (!s.getId().equals(session.getId())) {
//                    s.getBasicRemote().sendText(JSONUtil.toJsonStr(contentBo));
//                }
//            }
//        }catch (Exception e){
//            e.printStackTrace();
//        }
//    }
//    //用户和客户端互相传递消息
//    @OnMessage
//    public void onMessage(String message, Session session) {
//        //消息
//        Map<String, String> result = new HashMap<>();
//
//        UserDO userDO = serverSessionMap.get(session.getId());
//        //客服消息
//        if (userDO != null) {
//            System.out.println("客服" + session.getId() + "发送消息：\"" + message + "\"给用户" + serverSessionMap.get(session.getId()).ge());
//            result.put("msg", "客服" + session.getId() + "：" + message);
//            //将消息发送给用户
//            //要判断是否绑定到有用户如果有就将消息传递到用户
//            if (null != serverSessionMap.get(session.getId()).getTargetSessionId()) {
//                sendMsg(userSessionMap.get(serverSessionMap.get(session.getId()).getTargetSessionId()).getSession(), JSON.toJSONString(result));
//            } else {//如果没有就将消息给自己，嘻嘻嘻
//                sendMsg(session, JSON.toJSONString(result));
//            }
//
//        } else {//用户消息
//            System.out.println("用户" + session.getId() + "发送消息：\"" + message + "\"给客户" + userSessionMap.get(session.getId()).getTargetSessionId());
//            result.put("msg", "用户" + session.getId() + "：" + message);
//            //将消息发送给客服
//            //判断是否绑定了客服，如果有就发送消息
//            if (null != userSessionMap.get(session.getId()).getTargetSessionId()) {
//                sendMsg(serverSessionMap.get(userSessionMap.get(session.getId()).getTargetSessionId()).getSession(), JSON.toJSONString(result));
//            } else {//同上
//                sendMsg(session, JSON.toJSONString(result));
//            }
//        }
//    }
//
//
//    @OnError
//    public void error( Throwable throwable ) {
//        try {
//            throw throwable;
//        } catch (Throwable e) {
//            log.error("未知错误");
//        }
//    }
//}
//
